// 在 JavaScript 中，所有运算符都会返回一个值。
// 运算元 ———— 运算符应用的对象。比如说乘法运算 5 * 2，有两个运算元：左运算元 5 和右运算元 2。

// 一元运算符 ———— 只有一个运算元的运算符。比如说负号 -，它只需要一个运算元。
let x = 1
x = -x
console.log(x) // -1

// 二元运算符 ———— 一个运算符拥有两个运算元。
let y = 1,
	z = 3
console.log(z - y) // 2

// 数学运算：+(加法) -(减法) *(乘法) /(除法) %(取余) **(求幂，多少次方)

// 取余：a % b 结果是 a 整除 b 的余数。
console.log(5 % 2) // 1;

// 求幂：a ** b 结果是 a 的 b 次方。
console.log(2 ** 2) // 4

// 一元 + 运算符拼接字符串
console.log(1 + '2') // "12"
console.log('3' + 4) // "34"
console.log(1 + 1 + '2') // "22"
console.log('2' + 1 + 1) // "211"

// 一元 + 号运算符，单独使用时会将非数字类型转换为数字类型。与 Number() 函数作用相同。
console.log(+'') // 0
console.log(+true) // 1
console.log(+false) // 0
console.log(+undefined) // NaN

// 运算符优先级：一元运算符 大于 二元运算符。等号 = 优先级最低。

let s1 = '1'
let s2 = '2'
let v = +s1 + +s2 // 按优先级，先执行 +s1 和 +s2（一元运算），再执行 + 运算符（二元运算），再 = 号赋值（赋值运算）。
console.log(v) // 3

// 原地修改
let n = 1
n += 2
n *= 3
console.log(n) // 9

// *********************************************************************************************************************

// 自增/自减运算符（只能用于变量，直接用于数字会报错）
let c1 = 1
c1++
console.log(c1) // 2
c1--
console.log(c1) // 1

// 前置形式：前置形式返回一个新的值。
let d1 = 1
let d2 = ++d1
console.log(d2) // 2

// 后置形式：后置返回原来的值（做加法/减法之前的值）。
let d3 = 2
let d4 = d3++
console.log(d4) // 2

// 总结：如果 自增/自减的值不会被使用，那么两者形式没有区别。
// 例如：
let e1 = 1
e1++
++e1
// 以上两者没有区别，都返回 2。
// 在变量被使用的情况下，如果想要立即使用自增后的值，就用前置形式；如果想要将数+1，但还是返回原来的值，就用后置形式。

// **********************************************************************************************************************

// 位运算符：位运算符把运算元当做 32 位整数，并在它们的二进制表现形式上进行操作。

// 按位与 &
console.log(5 & 3) // 1 当两个二进制位都为 1 时，结果才为 1。

// 按位或 |
console.log(5 | 3) // 7 当两个二进制位中有任意一个为 1 时，结果为 1。

// 按位异或 ^
console.log(5 ^ 3) // 6 当两个二进制位不同时，结果为 1。

// 按位非 ~
console.log(~5) // -6 按位取反，即把 5 的二进制表示中的 0 和 1 互换。

// 左移 <<
console.log(5 << 1) // 10 左移一位相当于乘以 2。

// 右移 >>
console.log(5 >> 1) // 2 右移一位相当于除以 2。

// 无符号右移 >>>
console.log(5 >>> 1) // 2 无符号右移，忽略最左边的符号位，直接右移。

// *************************************************************************

// 逗号运算符：逗号运算符能让我们处理多个表达式，使用 , 将它们分开。每个表示都会执行，但只有最后一个结果会被返回。

let a = (1 + 2, 3 + 4) // 1 + 2 计算后结果被丢弃，返回 3 + 4 的结果，即 7。
console.log(a) // 7

// 逗号运算符的优先级非常低，比 = 还要低。
